use std::env;

pub struct OperatingSystem {
    name: String,
    version: String,
    arch: String,
}

impl OperatingSystem {
    pub fn new() -> Self {
        Self {
            name: env::consts::OS.to_string(),
            version: Self::get_os_version(),
            arch: env::consts::ARCH.to_string(),
        }
    }

    pub fn refresh(&mut self) {
        // 操作系统信息通常不需要频繁刷新
    }

    fn get_os_version() -> String {
        #[cfg(target_os = "linux")]
        {
            std::fs::read_to_string("/etc/os-release")
                .map(|content| {
                    content
                        .lines()
                        .find(|line| line.starts_with("VERSION="))
                        .map(|line| line.split('=').nth(1).unwrap_or("").trim_matches('"').to_string())
                        .unwrap_or_else(|| "Unknown".to_string())
                })
                .unwrap_or_else(|_| "Unknown".to_string())
        }

        #[cfg(target_os = "windows")]
        {
            "Windows Version".to_string() // 需要通过 Windows API 获取具体版本
        }

        #[cfg(target_os = "macos")]
        {
            "MacOS Version".to_string() // 需要通过 MacOS API 获取具体版本
        }
    }

    /// 获取操作系统名称
    pub fn name(&self) -> &str {
        &self.name
    }

    /// 获取操作系统版本
    pub fn version(&self) -> &str {
        &self.version
    }

    /// 获取系统架构
    pub fn arch(&self) -> &str {
        &self.arch
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_os_new() {
        let os = OperatingSystem::new();
        println!("操作系统信息:");
        println!("  名称: {}", os.name());
        println!("  版本: {}", os.version());
        println!("  架构: {}", os.arch());
        
        assert!(!os.name().is_empty(), "操作系统名称不应为空");
        assert!(!os.version().is_empty(), "操作系统版本不应为空");
        assert!(!os.arch().is_empty(), "系统架构不应为空");
    }

    #[test]
    fn test_os_info_consistency() {
        let os = OperatingSystem::new();
        println!("环境变量与OS信息对比:");
        println!("  系统名称: {} (env) vs {} (os)", env::consts::OS, os.name());
        println!("  系统架构: {} (env) vs {} (os)", env::consts::ARCH, os.arch());
        
        assert_eq!(os.name(), env::consts::OS, "操作系统名称应与环境变量一致");
        assert_eq!(os.arch(), env::consts::ARCH, "系统架构应与环境变量一致");
    }

    #[test]
    fn test_os_refresh() {
        let mut os = OperatingSystem::new();
        let initial_version = os.version().to_string();
        
        // 刷新不应改变基本信息
        os.refresh();
        assert_eq!(os.version(), initial_version, "刷新不应改变操作系统版本");
    }

    #[test]
    fn test_os_version_format() {
        let os = OperatingSystem::new();
        let version = os.version();
        println!("操作系统版本信息: {}", version);
        
        assert!(!version.is_empty(), "版本号不应为空");
        
        #[cfg(target_os = "linux")]
        {
            println!("Linux 版本号格式验证");
            assert!(version.chars().any(|c| c.is_numeric()), 
                "Linux版本号应包含数字");
        }
        
        #[cfg(target_os = "macos")]
        {
            println!("MacOS 版本信息");
        }
        
        #[cfg(target_os = "windows")]
        {
            println!("Windows 版本信息");
        }
    }
} 